代码改变世界

算法导论-二叉查找树习题解

2012-02-16 13:19  meteorgan  阅读(745)  评论(0编辑  收藏  举报

 

12.2-9 设T为一棵其关键字均不相同的二叉查找树,并设x为一个叶子节点,y是其父节点。证明:key[y]或者是T中大于key[x]的最小关键字,或者是T中小于key[x]的最大关键字。

  若x是y的左节点,y是x的后继,此时key[y]是大于key[x]的最小关键字;若x是y的右节点,y是x的前驱,此时key[y]是小于key[x]的最大关键字。

 

12.4-2 请描述这样的一棵二叉查找树:其中每个节点的平均深度为Θ(lgn),但树的深度是ω(lgn)。对于一棵含n个节点的二叉查找数,如果其中每个节点的平均深度为Θ(lgn),给出其高度的一个渐进上界。

  方法来自stackoverflow的这个帖子。思路:对于一个二叉查找树,使其平均高度最低,但高度最大的方法是,使这棵树成为一个完美二叉树但有一个尾巴,这个尾巴是一条单链。

  由于是求渐进界,我们可以做一些假设,完美二叉树部分总结点数为2k-1,这部分路径总长度为2*1 + 4*2 + 4*3 + … + 2k-1* k ≈ k*2k尾巴长度为f(n),这段总长度为k+(k+1)+……+(k+f(n)-1) =

  f2(n)/2 - f(n)/2 + k*f(n)。二叉树路径总长度为 k*2k + f2(n)/2 - f(n)/2 + k*f(n)。又2k - 1 + f(n) = n,所以有 2k≈ n - f(n), k ≈ lg(n - f(n))。省略一些低阶项,二叉树平均高度为:

  ((lg[n-f(n)]*(n-f(n)] + f2(n))/n,当f(n) = O(1) 或 f(n) = O(√nlgn)时,平均高度为Θ(lgn)。所以高度上界为O(√nlgn)。

  

12-3 随机构造的二叉查找树中节点的平均深度

  a) 定义

  b) 由 d(x, TL) = d(x, T) - 1 和 d(x, TR) = d(x, T) - 1 即可得到结论。

  c) 随机构造的二叉树,按照左子树节点个数可以分为n类(0 - n-1),每类子树的平均总路径长度为P(i) + P(n-i-1) + n - 1。n 类的平均总长度为 \frac{1}{n}\sum_{i=0}^{n-1}P(i)+P(n-1-i)+n-1

  d) c)中公式可写为

P(n) = \frac{1}{n}\sum_{i=0}^{n-1}P(i) + \frac{1}{n}\sum_{i=0}^{n-1}P(n-i-1) + \Theta(n) = \frac{2}{n}\sum_{k=0}^{n-1}P(k) + \Theta(n)\nonumber

 e) 过程有点儿烦,思路:1. 代换法,令P(k) = ak\lg k + b。2. 证\sum_{i=2}^{n-1}k\lgk \le \frac{1}{2}n^{2}\lgn - \frac{1}{8}n^{2},方法:令   \sum_{i=2}^{n-1}k\lg k = \sum_{i=2}^{\lceil n/2\rceil-1}k\lg k + \sum_{i=\lceil n/2\rceil}^{n-1}k\lg k  展开即可。

 

12-4 不同二叉树数目

  a) 假设左子树有k个顶点,则右子树有n-1-k个顶点。不同左子树数目为bk,不同右子树数目为bn-1-k,此类二叉树数目为bibn-k-1。不同二叉树数目为b_{n} = \sum_{k=0}^{n-1}b_{k}b_{n-k-1}

  b)

\begin{align}B^2(x) = \sum_{n=0}^{\infty}b_{n}x^{n} * \sum_{n=0}^{\infty} b_{n}x^{n} =\sum_{n=1}^{\infty}\sum_{i+j = n}b_{i}b_{j}x^{n-1} + b_{0} = \sum_{n=1}^{\infty}b_{n}x^{n-1} + b_{0} \nonumber\\= \sum_{n=0}^{\infty}b_{n}x^{n}\nonumber\end{align}

  c) 输入公式太烦了……

  d) stirling 公式